#ifndef __SOFTTIMER_H__
#define __SOFTTIMER_H__

#include <stdint.h>

/*
 * @note 依赖项：
    "cbb_mem.h"     内存管理 -- 可选
*/

// 替换为自己的内存管理头文件 -- 不使用内存管理时可注释掉
#include "cbb_mem.h"
#define SOFT_TIM_MALLOC(size)  S_MALLOC(size)

// 不适用内存管理 -- 全局创建软定时器类
#ifndef SOFT_TIM_MALLOC
#define SOFT_TIM_MALLOC(size)  NULL
#endif

// 软定时器事件
enum {
    SOFT_TIM_TIMOUT = 0,
};

// 事件处理返回值
typedef enum SOFT_TIM_RET{
    SOFT_TIM_OK = 0,
    SOFT_TIM_ERR,
}SOFT_TIM_RET_t;

// 软定时器结构体
typedef struct Soft_Tim{

    uint16_t u16Tick;           // 定时器计数
    uint16_t u16Flag;           // 定时器标志,bit0 -- 定时器事件, bit1 -- 定时器使能状态，
    uint16_t u16Interval;       // 定时器周期
    uint16_t u16Reserved;       // 保留
}Soft_Tim_t;

/**
 * @brief 注册软定时器
 * @param u16Interval 定时器周期
 * @return 软定时器结构体指针
 */
Soft_Tim_t*
cbb_soft_tim_register(uint16_t u16Interval);

/**
 * @brief 监视软定时器
 * @param pstTim 软定时器结构体指针
 * @return @see SOFT_TIM_RET_t
 */
SOFT_TIM_RET_t 
cbb_soft_tim_monitor(Soft_Tim_t* pstTim);

/**
 * @brief 设置软定时器周期
 * @param pstTim 软定时器结构体指针
 * @param u16Interval 定时器周期
 * @return @see SOFT_TIM_RET_t
 */
SOFT_TIM_RET_t
cbb_soft_tim_set_interval(Soft_Tim_t* pstTim, uint16_t u16Interval);

/**
 * @brief 使能软定时器
 * @param pstTim 软定时器结构体指针
 * @param u8Enable 使能标志，0 -- 禁止定时器，1 -- 使能定时器
 * @return @see SOFT_TIM_RET_t
 */
SOFT_TIM_RET_t 
cbb_soft_tim_enable(Soft_Tim_t* pstTim, uint8_t u8Enable);

/**
 * @brief 获取软定时器超时标志
 * @param pstTim 软定时器结构体指针
 * @return 超时标志，0 -- 未超时，1 -- 超时
 */
uint8_t 
cbb_soft_tim_timeout(Soft_Tim_t* pstTim);

/**
 * @brief 清除软定时器超时标志
 * @param pstTim 软定时器结构体指针
 * @return @see SOFT_TIM_RET_t
 */
SOFT_TIM_RET_t
cbb_soft_tim_clear_timeout(Soft_Tim_t* pstTim);

#endif /* __SOFTTIMER_H__ */
